package Persistance;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import Controller.AdministradorCosechas;
import Enums.Periodo;
import Model.Cereal;
import Model.CerealCosechaFina;
import Model.CerealCosechaGruesa;
import Model.Mineral;

public class CerealDataMapper implements IDataMapper<Cereal>
{

	public boolean insert(Cereal cereal) 
	{
		Connection conn = PoolConnection.getPoolConnection().getConnection();
		
		try 
		{
            PreparedStatement stat = conn.prepareStatement("insert into cereal values (?, ?, ?, ?, ?, ?, ?)");
            
            stat.setString(1, cereal.getNombre());
            stat.setInt(2, cereal.getPeriodoSiembra().ordinal());
            stat.setFloat(3, cereal.getRindeTn());
            stat.setString(4, cereal.getMineralPrinc().getCodigo());
            stat.setString(5, AdministradorPersistencia.booleanToString(cereal.isActivo()));
            stat.setFloat(6, cereal.getPorcDesperdicio());
            stat.setString(7, cereal.getPorcDesperdicio() > 0 ? "F" : "T");
            
            int rowCount = stat.executeUpdate();
            
            PoolConnection.getPoolConnection().realeaseConnection(conn);
            
            return rowCount == 1;
        }
		catch (SQLException ex) 
		{
			System.out.println(ex.getMessage());
			return false;
        }
		finally
		{
			PoolConnection.getPoolConnection().realeaseConnection(conn);
		}
	}

	public boolean update(Cereal cereal) 
	{
		Connection conn = PoolConnection.getPoolConnection().getConnection();
		
		try 
		{
            PreparedStatement stat = conn.prepareStatement("update cereal set periodoSiemb = ?, rindeTn = ?, " +
            												" codMineralPrinc = ?, activo = ?, porcDesperdicio = ? " +
            												"where nombre = ?");
            
            
            stat.setInt(1, cereal.getPeriodoSiembra().ordinal());
            stat.setFloat(2, cereal.getRindeTn());
            stat.setString(3, cereal.getMineralPrinc().getCodigo());
            stat.setString(4, AdministradorPersistencia.booleanToString(cereal.isActivo()));
            stat.setFloat(5, cereal.getPorcDesperdicio());
            stat.setString(6, cereal.getNombre());
            
            int rowCount = stat.executeUpdate();
            
            PoolConnection.getPoolConnection().realeaseConnection(conn);
            
            return rowCount == 1;
        }
		catch (SQLException ex) 
		{
			System.out.println(ex.getMessage());
			return false;
        }
		finally
		{
			PoolConnection.getPoolConnection().realeaseConnection(conn);
		}
	}

	public boolean delete(Cereal cereal) 
	{
		Connection conn = PoolConnection.getPoolConnection().getConnection();
		
		try 
		{
            PreparedStatement stat = conn.prepareStatement("update cereal set activo = 'F' where nombre = ?");
            
            stat.setString(1, cereal.getNombre());
            
            int rowCount = stat.executeUpdate();
            
            PoolConnection.getPoolConnection().realeaseConnection(conn);
            
            return rowCount == 1;
        }
		catch (SQLException ex) 
		{
			System.out.println(ex.getMessage());
			return false;
        }
		finally
		{
			PoolConnection.getPoolConnection().realeaseConnection(conn);
		}
	}

	public Cereal findById(Cereal cereal) 
	{
		Cereal cerealEncontrado = null;
		Connection conn = PoolConnection.getPoolConnection().getConnection();
		
		try 
		{
            PreparedStatement stat = conn.prepareStatement("select * from cereal where nombre = ?");
            stat.setString(1, cereal.getNombre());
            
            ResultSet rs = stat.executeQuery();
            
            if (rs.next()) 
            {
            	String nombre = rs.getString("nombre");
            	Periodo periodoSiembra = Periodo.values()[rs.getInt("periodoSiemb")];
            	float rinde = rs.getFloat("rindeTn");
            	String codMineralPrinc = rs.getString("codMineralPrinc");
            	boolean activo = AdministradorPersistencia.stringToBoolean(rs.getString("activo"));
            	float porcDesperdicio = rs.getFloat("porcDesperdicio");
            	boolean esFino = AdministradorPersistencia.stringToBoolean(rs.getString("esFino"));
            	
            	Mineral mineralPrincipal = AdministradorCosechas.getSharedInstance().findMineral(codMineralPrinc);
            	
            	if (esFino)
            		cerealEncontrado = new CerealCosechaFina(nombre, periodoSiembra, rinde, mineralPrincipal);
            	else
            		cerealEncontrado = new CerealCosechaGruesa(nombre, periodoSiembra, rinde, mineralPrincipal, porcDesperdicio);
            	
            	cerealEncontrado.setActivo(activo);
            }
            
            PoolConnection.getPoolConnection().realeaseConnection(conn);
        } 
		catch (SQLException ex) 
		{
			System.out.println(ex.getMessage());
        }
		finally
		{
			PoolConnection.getPoolConnection().realeaseConnection(conn);
		}

		return cerealEncontrado;
	}


	public List<Cereal> findAll() 
	{
		ArrayList<Cereal> result = new ArrayList<Cereal>();
		Connection conn = PoolConnection.getPoolConnection().getConnection();
		
		try 
		{
            Statement stat = conn.createStatement();
            ResultSet rs = stat.executeQuery("select * from cereal");
            
            while (rs.next()) 
            {
            	String nombre = rs.getString("nombre");
            	Periodo periodoSiembra = Periodo.values()[rs.getInt("periodoSiemb")];
            	float rinde = rs.getFloat("rindeTn");
            	String codMineralPrinc = rs.getString("codMineralPrinc");
            	boolean activo = AdministradorPersistencia.stringToBoolean(rs.getString("activo"));
            	float porcDesperdicio = rs.getFloat("porcDesperdicio");
            	boolean esFino = AdministradorPersistencia.stringToBoolean(rs.getString("esFino"));
            	
            	Mineral mineralPrincipal = AdministradorCosechas.getSharedInstance().findMineral(codMineralPrinc);
            	
            	Cereal cereal = null;
            	
            	if (esFino)
            		cereal = new CerealCosechaFina(nombre, periodoSiembra, rinde, mineralPrincipal);
            	else
            		cereal = new CerealCosechaGruesa(nombre, periodoSiembra, rinde, mineralPrincipal, porcDesperdicio);
            	
            	cereal.setActivo(activo);
                result.add(cereal);
            }
        } 
		catch (SQLException ex) 
		{
			System.out.println(ex.getMessage());
        }
		finally
		{
			PoolConnection.getPoolConnection().realeaseConnection(conn);
		}

		return result;
	}

	

}
